#pragma once

#include "Poller.h"
#include "Channel.h"
#include "TaskQueue.h"
#include "ThreadPool.h"

namespace GiSo {


/**
 * @brief EventLoop 是事件驱动模型的核心，负责调度和协调事件处理。
 *
 * EventLoop 通过 Poller 监听文件描述符上的事件，并通过任务队列处理来自其他线程的操作请求。
 */
class EventLoop {
public:
    /**
     * @brief 构造函数.
     * @param threadNum 线程数.为0代表单线程不使用线程池
     */
    EventLoop(int threadNum);

    /**
     * @brief 析构函数.
     */
    ~EventLoop();

    /**
     * @brief 运行事件循环.
     *
     * 不断监听事件并处理活跃的 Channel。
     */
    void Run();

    void Stop(){
        m_Running = false;
    }

    /**
     * @brief 更新 Channel 的监听状态.
     *
     * @param channel 要更新的 Channel 对象指针.
     */
    void UpdateChannel(Channel* channel);

    /**
     * @brief 移除 Channel 的监听.
     *
     * @param channel 要移除的 Channel 对象指针.
     */
    void RemoveChannel(Channel* channel);

    ThreadPool& GetThreadPool() { return m_ThreadPool; }

    TaskQueue::Ptr GetTaskQueue(int i) { return m_ThreadPool.GetQueue(i); }

    TaskQueue::Ptr GetMainQueue() { return m_MainQueue; }

private:
    /**
     * @brief 处理任务队列中的任务.
     */
    void ProcessTasks();

    /**
     * @brief 默认 poll 超时时间 (10 秒).
     */
    static const int kPollTimeoutMs = 2000;

    Poller m_Poller; ///< Poller 实例，用于监听事件

    bool m_Running = false; ///< 标记 EventLoop 是否正在运行

    ThreadPool m_ThreadPool; ///< 线程池，用于处理任务队列中的任务
    TaskQueue::Ptr m_MainQueue; ///< 主线程的任务队列
};


} // namespace GiSo